package redis

import (
	"context"
	"fmt"
	"github.com/go-redis/redis/v8"
)

func InitClient() *redis.Client {
	//单节点redis实例
	addr := "127.0.0.1:6370"
	RedisClient := redis.NewClient(&redis.Options{
		Addr:     addr,
		Password: "",
		DB:       0,
		PoolSize: 100,
	})

	var cmd *redis.StatusCmd = RedisClient.Ping(context.Background())
	fmt.Println(cmd.Result())

	return RedisClient
}

func InitSentinelClient(masterName string) *redis.Client {
	/**
	sentinel集群启动过程：
	1  主节点启动、从节点启动  从节点通过slaveof 或replicaof 配置
	2  sentinel节点启动  定期发送心跳检测主节点。

	failover过程
	1  主节点宕机，经过主观下线、客观下线后，进行failover
	2  failover选取某个从节点为主节点  其他从节点执行fullsync，从新的主节点同步数据。然后进行增量同步
	3  原先的主节点恢复后，自动转为从节点，并进行fullsync和增量同步
	*/

	//sentinel地址
	sentinelAddrs := []string{"127.0.0.1:17100"}
	RedisClient := redis.NewFailoverClient(&redis.FailoverOptions{
		MasterName:    masterName,
		SentinelAddrs: sentinelAddrs,
	})
	return RedisClient
}

func InitClusterClient() *redis.ClusterClient {
	/**
	redis集群说明：
	节点分片：
	主从节点：
	选举过程：
	failover:
	*/

	//集群地址
	clusterAddr := []string{"127.0.0.1:6390", "127.0.0.1:6391", "127.0.0.1:6392",
		"127.0.0.1:6393", "127.0.0.1:6394", "127.0.0.1:6395"}

	clusterClient := redis.NewClusterClient(&redis.ClusterOptions{
		Addrs: clusterAddr,
	})
	return clusterClient
}
